home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / chdir.c < prev    next >
C/C++ Source or Header  |  1995-05-28  |  3KB  |  99 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  chdir.c,v 1.1.1.1 1994/04/04 04:30:15 amiga Exp
  20.  *
  21.  *  chdir.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:15  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.3  1992/08/09  20:43:22  amiga
  26.  *  change to use 2.x header files by default
  27.  *
  28.  *  Revision 1.2  1992/05/22  01:45:51  mwild
  29.  *  remove ix_panic call, seems to happen more than I thought
  30.  *
  31.  * Revision 1.1  1992/05/14  19:55:40  mwild
  32.  * Initial revision
  33.  *
  34.  */
  35.  
  36. #define KERNEL
  37. #include "ixemul.h"
  38. #include "kprintf.h"
  39.  
  40. /* if we change our directory, we have to remember the original cd, when
  41.  * the process was started, because we're not allowed to unlock this
  42.  * lock, since we didn't obtain it. */
  43. /* BPTR __startup_cd = -1; */
  44. #define __startup_cd (u.u_startup_cd)
  45.  
  46. int
  47. chdir (char *path)
  48. {
  49.   BPTR oldlock, newlock;
  50.   int error;
  51.   int omask;
  52.   char *buf = (char *) kmalloc (MAXPATHLEN);
  53.   struct stat stb;
  54.   /* Sigh... CurrentDir() is a DOS-library function, it would probably be
  55.    * ok to just use pr_CurrentDir, but alas, this way we're conformant to
  56.    * programming style guidelines, but we pay the overhead of locking dosbase
  57.    */
  58.  
  59.   if (syscall (SYS_stat, path, &stb) == 0 && !(stb.st_mode&S_IFDIR))
  60.   {
  61.     errno = ENOTDIR;
  62.     KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  63.     return -1;
  64.   }
  65.  
  66.   omask = syscall (SYS_sigsetmask, ~0);
  67.  
  68.   newlock = __lock (path, ACCESS_READ);
  69.  
  70.   if (newlock)
  71.     {
  72.       oldlock = CurrentDir (newlock);
  73.       if (__startup_cd == (BPTR)-1) __startup_cd = oldlock;
  74.       else __unlock (oldlock);
  75.  
  76.       /* this one is for Mike B. Smith ;-) */
  77.       /* kmalloc is lots cheaper than malloc */
  78.       if (buf)
  79.         {
  80.           /* NOTE: This shortcuts any symlinks. But then, Unix does the
  81.            *       same, and a shell that wants to be smart about symlinks,
  82.            *       has to track chdir()s itself as well */
  83.           if (NameFromLock (newlock, buf, MAXPATHLEN))
  84.             SetCurrentDirName (buf);
  85.           kfree (buf);
  86.         }
  87.       /* but no matter what happened above, I consider the chdir() to have
  88.        * succeeded, whether the stored name is correct or not. */
  89.       syscall (SYS_sigsetmask, omask);
  90.       return 0;
  91.     }
  92.   error = __ioerr_to_errno (IoErr ());
  93.  
  94.   syscall (SYS_sigsetmask, omask);
  95.   errno = error;
  96.   KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  97.   return -1;
  98. }
  99.